package tebiang.zxy.demo1.handler.impl;

import tebiang.zxy.demo1.entity.Message;
import tebiang.zxy.demo1.handler.MessageHandler;

/**
 * @auther zhangxiaoyu
 * @date 2024/4/11 15:02
 * @description
 */
public abstract class AbstractMessageHandler implements MessageHandler {


    /**
     * 模版方法：定义消息处理的整个流程
     * @param message
     */
    @Override
    public void handleMessage(Message message) {
        // 消息去重
        if(isDuplicateMessage(message)){
            return;
        }
        try{
            // 具体的消息处理逻辑
            consumMessage(message);
        }catch (Exception e){
            // 消息异常处理
            exceptionMessage(message);
        }

        // 消息持久化保存
        saveMessage(message);
    }

    /**
     * 由具体消息处理类实现具体的消息处理逻辑
     */
    public abstract void consumMessage(Message message);

    /**
     * 判断是否为重复消息
     * @param message
     * @return
     */
    public boolean isDuplicateMessage(Message message){
        // 从具体的存储中 查询是否存在
        // 比如从mysql数据库中查询
        // 或者从redis中查询
        // TODO
        return false;
    }

    /**
     * 消息重试
     * @param message
     */
    public void exceptionMessage(Message message){
        // 消费失败是否进行重试
        // 定义一个最大重试次数 可以是spring的自定义配置，也可以在类中固定常量
        // if (retryCount < maxRetryCount) {
        //        // 重新尝试处理消息
        //        retryCount++;
        //    } else {
        //        // 达到最大重试次数，可能需要记录日志或者放入死信队列进行后续处理
        //    }
        // 如果是，则将消息重新放入队列
        // TODO
    }

    /**
     * 消息持久化保存
     * @param message
     */
    public void saveMessage(Message message){
        // 消息持久化保存
        // 同样可以使用redis或者mysql
        // TODO
    }

    /**
     * 消息顺序消费
     * 具体实现逻辑有待考量
     */

}
